#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
void Usage(std::string proc)
{
    std::cout << "\n\rUsage: " << proc << " serverip serverport\n"
              << std::endl;
}
// 客户端
int main(int argc,char*argv[])
{
    // 1.客户端从网络中获取数据，得创建套接字
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0)
    {
        std::cout << "socker error" << std::endl;
        return 1;
    }

    if (argc != 3)
    {
        Usage(argv[0]);
        exit(0);
    }
    
    std::string ip=argv[2];
    std::uint16_t port=std::stoi(argv[1]);
    //主机信息 :通过参数列表来获取
    //还得转换为网络字节序列
    struct sockaddr_in server;
    server.sin_family=AF_INET;
    server.sin_port=htons(port);
    server.sin_addr.s_addr=inet_addr(ip.c_str());  //四点ip转化为4字节ip
    socklen_t len=sizeof(server);
    // 2.绑定，我们自己不要手动绑定，一般由OS自由随机选择！
    char buffer[1024];
    std::string message;

    struct sockaddr_in tmp;
    memset(&tmp,0,sizeof(tmp));
    socklen_t len2=sizeof(tmp);
    while (1)
    {
        // 3.向服务器发送消息
       
        getline(std::cin,message);

        sendto(sockfd,message.c_str(),message.size(),0,(const struct sockaddr*)&server,len);


        //客户端收到服务器发来的消息
        int n=recvfrom(sockfd,buffer,sizeof(buffer),0,(struct sockaddr*)&tmp,&len2);
        if(n>0)
        {
            std::cout<<buffer<<std::endl;
            memset(buffer,0,sizeof(buffer));
        }
    }

    close(sockfd);

    return 0;
}
